home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / X11 / xconq / map.h < prev    next >
C/C++ Source or Header  |  1995-05-09  |  4KB  |  134 lines

  1. /* Copyright (c) 1987, 1988  Stanley T. Shebs, University of Utah. */
  2. /* This program may be used, copied, modified, and redistributed freely */
  3. /* for noncommercial purposes, so long as this notice remains intact. */
  4.  
  5. #pragma comment(exestr, "@(#) map.h 12.1 95/05/09 ")
  6.  
  7. /* RCS $Header: map.h,v 1.1 88/06/21 12:29:42 shebs Exp $ */
  8.  
  9. /* Definitions of levels of detail in mapfiles.  These values must be */
  10. /* ordered, so careful about fiddling with them. */
  11.  
  12. #define SIDEBASIC 1
  13. #define SIDESLOTS 2
  14. #define SIDEVIEW  3
  15. #define SIDEMISC  4
  16. #define SIDEALL   9  /* guaranteed max */
  17.  
  18. #define UNITBASIC  1
  19. #define UNITSLOTS  2
  20. #define UNITORDERS 3
  21. #define UNITALL    9  /* guaranteed max */
  22.  
  23. /* These limit the junk in mapfile headers. */
  24.  
  25. #define MAXINCLUDES 9     /* max number of included files */
  26. #define MAXMAPNOTES 40    /* max lines of notes */
  27.  
  28. /* Theoretically, there is no maximum size to xconq maps, but the minimum */
  29. /* size is set by mystical properties of display, and is not negotiable. */
  30.  
  31. #define MINWIDTH 5
  32. #define MINHEIGHT 5
  33.  
  34. /* Letters for hex and outlined hex.  Exact use is up to the interface - */
  35. /* the X interface has hexagonal shapes in its xconq font for these.  No */
  36. /* problems about conflicting with unit or terrain characters. */
  37.  
  38. #define HEX 'O'
  39. #define OHEX 'o'
  40.  
  41. /* This structure should be as small as possible, since it is an */
  42. /* individual entry in the array containing the entire world. */
  43. /* The "type" and "people" slots could be combined, but this might */
  44. /* slow accesses undesirably, because of bit field extraction. */
  45.  
  46. typedef struct a_hex {
  47.     char type;            /* terrain type at this spot */
  48.     char people;          /* alignment/number of people in this hex */
  49.     struct a_unit *surf;  /* pointer to unit if any */
  50. } Hex;
  51.  
  52. /* Just for convenience, global variables about map live in this structure. */
  53.  
  54. typedef struct a_world {
  55.     int width, height;    /* size of the world */
  56.     int scale;            /* scale in km (not really very important) */
  57.     bool known;           /* true if everybody knows what world looks like */
  58.     Hex *terrain;         /* pointer to array of hexes */
  59. } World;
  60.  
  61. /* The type of a hex in the world is a small number representing the */
  62. /* terrain type.  Only about 10 types are defined, in terrain.h */
  63.  
  64. #ifdef SCO_UNIX
  65.  
  66. #define terrain_at(x,y) ((world.terrain[windex((x),(y))]).type)
  67.  
  68. #define set_terrain_at(x,y,t) \
  69.   ((world.terrain[windex((x),(y))]).type = (t))
  70.  
  71. /* The people only have a side alignment, no mention of population */
  72. /* (at least for now). */
  73.  
  74. #define people_at(x,y) ((world.terrain[windex((x),(y))]).people)
  75.  
  76. #define set_people_at(x,y,p) \
  77.   ((world.terrain[windex((x),(y))]).people = (p))
  78.  
  79. #else /* SCO_UNIX */
  80.  
  81. #define terrain_at(x,y) ((world.terrain[(y)*world.width+(x)]).type)
  82.  
  83. #define set_terrain_at(x,y,t) \
  84.   ((world.terrain[(y)*world.width+(x)]).type = (t))
  85.  
  86. /* The people only have a side alignment, no mention of population */
  87. /* (at least for now). */
  88.  
  89. #define people_at(x,y) ((world.terrain[(y)*world.width+(x)]).people)
  90.  
  91. #define set_people_at(x,y,p) \
  92.   ((world.terrain[(y)*world.width+(x)]).people = (p))
  93.  
  94. #endif /* SCO_UNIX */
  95.  
  96. #define NOBODY 0
  97.  
  98. #define unpopulated(x,y) (people_at((x),(y)) == NOBODY)
  99.  
  100. /* The unit is a raw pointer - this macro is used a *lot*. (Any prospects */
  101. /* for optimization?) */
  102.  
  103. #ifdef SCO_UNIX
  104.  
  105. #define unit_at(x,y) ((world.terrain[windex((x),(y))]).surf)
  106.  
  107. #define set_unit_at(x,y,u) \
  108.   ((world.terrain[windex((x),(y))]).surf = (u))
  109.  
  110. #else /* SCO_UNIX */
  111.  
  112. #define unit_at(x,y) ((world.terrain[(y)*world.width+(x)]).surf)
  113.  
  114. #define set_unit_at(x,y,u) \
  115.   ((world.terrain[(y)*world.width+(x)]).surf = (u))
  116.  
  117. #endif /* SCO_UNIX */
  118.  
  119. /* This little macro implements wraparound in the x direction. */
  120. /* The stupid add is for the benefit of brain-damaged mod operators */
  121. /* that don't handle negative numbers properly. */
  122.  
  123. #define wrap(x) (((x) + 4*world.width) % world.width)
  124.  
  125. /* Constrain y to northern and southern edges. */
  126.  
  127. #define limit(y) (max(0, min((y), (world.height-1))))
  128.  
  129. #define interior(y) (max(1, min((y), (world.height-2))))
  130.  
  131. /* Declaration of the world itself. */
  132.  
  133. extern World world;
  134.